# coding:utf-8
'''
图片解析，但是由于验证码的背景乱码及模糊技术，导致效果不佳。不过代码仍然可以用在图片识别上
需要下载谷歌开源的tesseract-ocr，并设置环境变量
安装pytesseract、pytesser3
'''
import subprocess
from PIL import Image
from PIL import ImageOps
from PIL import ImageEnhance
from selenium import webdriver
import time
import pytesser3


def cleanImage(imagePath):
    image = Image.open(imagePath)  # 打开图片
    #如果是jpg格式转png，由于两者格式差异（差了一个A），需要做此转换
    # bg = Image.new("RGB", image.size, (255, 255, 255))
    # bg.paste(image, image)
    image = image.point(lambda x: 0 if x < 143 else 255)  # 处理图片上的每个像素点，使图片上每个点“非黑即白”
    borderImage = ImageOps.expand(image, border=20, fill='white')
    borderImage.save("123.png")

#第一种方法解析图片，pycharm有bug，只能运行文件才能看到效果
def getAuthCode(driver, imgRange):
    driver.get_screenshot_as_file('captcha.png')# 截屏，并保存图片
    im = Image.open('captcha.png')
    region = im.crop(imgRange)  # 此时，region是一个新的图像对象。
    region.save("captcha.png")
    time.sleep(0.5)
    cleanImage("captcha.png")
    authcodeImg = Image.open('123.png')
    enhancer = ImageEnhance.Contrast(authcodeImg)
    image2 = enhancer.enhance(4)
    p = subprocess.Popen(["tesseract", "123.png", "captcha"], stdout= subprocess.PIPE, stderr=subprocess.PIPE)
    p.wait()
    f = open("captcha.txt", "r")
    # Clean any whitespace characters
    print(f.read())
    captchaResponse = f.read().replace(" ", "").replace("\n", "")
    print("Captcha solution attempt: " + captchaResponse)
    if len(captchaResponse) == 4:
        return captchaResponse
    else:
        return False

#第二种方法
def getAuthCode2(driver,imgRange):
    driver.save_screenshot('login.png')#第二种方法将整个页面保存
    #开始截取验证码图片位置
    im = Image.open('login.png')
    region = im.crop(imgRange)  # 此时，region是一个新的图像对象。
    # region.show()#显示的话就会被占用，所以要注释掉
    region.save("captcha.png")
    cleanImage("captcha.png")
    #以下3行，如果图片解析不准确的话，可以加上增加辨认度
    authcodeImg = Image.open('123.png')
    enhancer = ImageEnhance.Contrast(authcodeImg)
    image2 = enhancer.enhance(4)
    authCodeText1 = pytesser3.image_to_string(image2).strip()
    print("Captcha solution attempt: " + authCodeText1)

def withoutCookieLogin(url):
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get(url)
    time.sleep(2)
    a=driver.find_element_by_xpath("//img[@id='captcha_img' and @class='yzm-img']")
    #获取验证码的准确坐标，方便截图
    imgRange=(a.location['x'], a.location['y'], a.location['x']+a.size['width'], a.location['y']+a.size['height'])
    authCode = getAuthCode(driver, imgRange)
    # authCode2=getAuthCode2(driver,imgRange)

driver = withoutCookieLogin("http://energy.cn/match")